package main

import (
	"fmt"
	"strings"
)

//累加器
//这就是一个名为AddUp per的闭包	闭包最终返回的是一个函数，但是该函数会用到函数外的一些变量，这些变量和该函数组成一个整体，就是闭包
func AddUpper() func(int) int {
	var n int = 10
	var str = "hello"
	return func(x int) int { //返回一个匿名函数，该函数引用到了外部的变量n，于是形成了一个整体，构成闭包
		n = n + x
		str += string(36) // => 36 = '$'
		fmt.Println("str=", str)
		return n
	}
}

//闭包的最佳实战
//请编写一个程序，具体要求如下
//1.编写一个函数 makeSuffix(suffix string) 可以接收一个文件后缀名(比如.jpg),并返回一个闭包
//2.调用闭包，可以传入一个文件名，如果该文件名没有指定的后缀(比如.jpg)，则返回 文件名.jpg,如果已经有.jpg后缀，则返回原文件名
//3.要求使用闭包的方式完成
//4.strings.HasSuffix,该函数可以判断某个字符串是否有指定的后缀
func makeSuffix(suffix string) func(string) string {
	return func(name string) string {
		//如果 name没有指定后缀，则加上，否则就返回原来的名字
		if !strings.HasSuffix(name, suffix) {
			return name + suffix
		}

		return name
	}
}

func main() {

	//使用前面的代码
	f := AddUpper()
	fmt.Println(f(1)) //11
	fmt.Println(f(2)) //13
	fmt.Println(f(3)) //16

	//测试makeSuffix 的使用
	//返回一个闭包
	f2 := makeSuffix(".jpg")
	fmt.Println("文件名处理后=", f2("winter"))   //winter.jpg
	fmt.Println("文件名处理后=", f2("bird.jpg")) //winter.jpg
}
